package com.carrot.mq.common;

import java.io.*;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * @date 2023/8/8 23:07
 * 序列化与反序列化
 */
public class BinaryTool {

    /**
     * 把一个对象序列化成一个字节数组
     */
    public static byte[] toBytes(Object object) throws IOException {
        // 变长的字节数组, 用于写入 object 序列化后的数据
        try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
            try (ObjectOutputStream outputStream = new ObjectOutputStream(byteArrayOutputStream)) {
                // 将对象序列化生成二进制字节数据写入到 ObjectOutputStream 最终写入到 ByteArrayOutputStream
                outputStream.writeObject(object);
            }
            // 将 byteArrayOutputStream 中持有的二进制数据取出并转成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    /**
     * 把一个字节数组, 反序列化成一个对象
     */
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)) {
                // 从 data 这个 byte[] 中读取数据并进行反序列化
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
